/*
 * @Description  : Array
 * @Autor        : 杜康
 * @Date         : 2021-08-14 06:05:33 +0800
 * @LastEditors  : 杜康
 * @LastEditTime : 2021-08-14 21:56:47 +0800
 */
import num from "../number";
import obj from "../object";

/**
 * @description: 求数组中非NaN数据的最大值
 * @param { Array } arr
 * @return {*}
 * @author: 杜康
 * @Date: 2021-08-14 07:12:42 +0800
 */
const getMax = (arr) => {
    arr = arr.filter((el) => !num.isNaN(el));
    return arr.length ? Math.max.apply(null, arr) : undefined;
};

/**
 * @description: 求数组中非NaN数据的最小值
 * @param { Array } arr
 * @return {*}
 * @author: 杜康
 * @Date: 2021-08-14 07:13:24 +0800
 */
const getMin = (arr) => {
    arr = arr.filter((el) => !num.isNaN(el));
    return arr.length ? Math.min.apply(null, arr) : undefined;
};

/**
 * @description: 判断对象或数组是否相等
 * @param {*} obj1
 * @param {*} obj2
 * @return {*}
 * @author: 杜康
 * @Date: 2021-08-14 06:07:08 +0800
 */
const isEqual = (obj1, obj2) => {
    // 两个数据有任何一个不是对象或数组
    if (!obj.isObject(obj1) || !obj.isObject(obj2)) {
        // 值类型(注意：参与equal的一般不会是函数)
        return obj1 === obj2;
    }
    // 如果传的两个参数都是同一个对象或数组
    if (obj1 === obj2) {
        return true;
    }

    // 两个都是对象或数组，而且不相等
    // 1.先比较obj1和obj2的key的个数，是否一样
    const obj1Keys = Object.keys(obj1);
    const obj2Keys = Object.keys(obj2);
    if (obj1Keys.length !== obj2Keys.length) {
        return false;
    }

    // 如果key的个数相等,就是第二步
    // 2.以obj1为基准，和obj2依次递归比较
    for (let key in obj1) {
        // 比较当前key的value  --- 递归
        const res = isEqual(obj1[key], obj2[key]);
        if (!res) {
            return false;
        }
    }

    // 3.全相等
    return true;
};

export default {
    getMax,
    getMin,
    isEqual,
};
